﻿#pragma once

#include "common.h"
#include "ObjectPool.h"
#include "pagemap.h"

class PageCache
{
public:
	// magic static, 单例模式(条件: c++11, 且编译器符合c++标准规定)
	static PageCache* getInstance()
	{
		static PageCache m_sInst;
		return &m_sInst;
	}
	// 获取从对象到span的映射
	Span* mapObjectToSpan(void* obj);
	// 释放空闲span回到Pagecache，并合并相邻的span
	void releaseSpanToPageCache(Span* span);
	// 获取一个K页的span
	Span* newSpan(size_t k);
	// 加锁
	void lock();
	// 解锁
	void unlock();
private:
	// 禁止拷贝构造和赋值
	PageCache() {}
	PageCache(const PageCache&) = delete;
	PageCache& operator=(const PageCache&) = delete;	
private:
	SpanList m_spanLists[NPAGES];					// 管理多个自由链表桶	
	ObjectPool<Span> m_spanPool;					// 管理span的内存池	
	std::mutex m_pageMutex;							// 互斥锁
	TCMalloc_PageMap1<32 - PAGE_SHIFT> m_idSpanMap;	// 使用tcmalloc的基数树，管理id和span的映射
};